<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1. subStr
        var strStr = function (haystack, needle) {
            if (needle === '') {
                return 0
            }
            let n = haystack.length - 1
            let m = needle.length - 1
            let i = 0
            let j = 0
            let count = 0 // count=0 表示匹配的开始 count>0表示匹配的一个过程 
            let first; // first用于记录匹配的开始 =》第一个索引
            while (i <= n && j <= m) {
                if (haystack[i] !== needle[j]) {
                    // 如果碰到不相等的值
                    if (count > 0) {
                        // 假设count大于0 且父串子串不等 说明子串查找中断
                        if (i <= n) {
                            // 如果 此时 父串还有值 应该继续遍历
                            // i = first + 1，比如mississippi issip
                            // issis  和 issip 此时发现最后一个字母不同 =>中断
                            // 所以父串索引 从 4 =》 2 从子串开头字母i在父串第一次出现的位置first 后面 + 1开始遍历
                            // 子串索引从 4 =》0
                            // count => 0，表示重新开始匹配
                            i = first + 1
                            j = 0
                            count = 0
                            continue// 用continue 而不是break
                        } else {
                            // 如果 此时中断，父串到头，直接跳出循环
                            return -1
                        }
                    }
                    i++
                } else {
                    // 如果父串查找到和子串一致的，count++
                    count++
                    // count===1时记录first表示第一次出现相等的索引
                    if (count === 1) {
                        first = i
                    }
                    if (j === m) {
                        // 如果子串遍历到头 都相等 return first
                        return first
                    }
                    // 父串和子串都跳出循环
                    i++
                    j++
                }
            }
            return -1
        };
        // console.log(strStr('abcd', 'cd')); // 2
        // console.log(strStr('abcdf', 'dfg')); // -1
        // console.log(strStr('', '')); // 0
        // console.log(strStr('a', '')); // 0
        // console.log(strStr('mississippi', 'issip')); // 4
        // console.log(strStr('mississippi', 'pi')); // 9
        // console.log(strStr('adceadca', 'adca')); // 9
        // issis中断   issip
    </script>
</body>

</html>